<?php

/**

    definir entorno

*/
/**
 *
 *  en etapa de desarrollo tenemos que enterarnos de todos los errores
 *  que se producen en la aplicacion. de esta manera configuramos el
 *  interprete de php para que nos muestre todos los errores,
 *  sobreescribiendo la configuración del php.ini
 *  ENTORNO DE DESARROLLO (DEV):    error_reporting E_ALL | E_STRICT
 *                                  display_errors  On
 *  ENTORNO DE PRODUCCION (PROD):   error_reporting E_ALL | ~E_DEPRECATED
 *                                  display_errors  Off
 *
 */
define('ENVIRONMENT', 'DEV');

switch (ENVIRONMENT) {
    case 'DEV':
        error_reporting(E_ALL | E_STRICT);
        ini_set('display_errors', true);
        break;
    case 'PROD':
        error_reporting(E_ALL | ~E_DEPRECATED);
        ini_set('display_errors', false);
        break;
}



/**

    traer FirePHP para debug

*/

require_once 'FirePHPCore/FirePHP.class.php';
$fp = FirePHP::getInstance(true);



/**

    definir constantes super super importantes

*/
/**
 *
 *  EN_CODE se usa en los archivos para evitar que se acceda de otra forma que
 *  no sea a traves del controlador frontal (front controller, este archivo)
 *
 *  BASE_DIR toma el valor del directorio base de la aplicacion
 *
 *  PUBLIC_DIR contiene el nombre del directorio publico del servidor
 *
 *  BASE_URL contiene el nombre completo del servidor
 *  (está definida más abajo, ya que hace uso de la clase Request,
 *  que aún no fue instanciada)
 *
 */
define('EN_CODE', true); // cuestiones de seguridad
define('BASE_DIR', __DIR__.'/../');
define('PUBLIC_DIR', 'public_html');
define('CSRF_TOKEN', 'esto-es_Code');



/**

    traer el class loader de Symfony2

*/
/**
 *
 *  el class loader de symfony2 utiliza los espacios de nombre (namespace)
 *  de las clases para buscarlas en el árbol de directorios.
 *  de esta forma no es necesario hacer un 'include' o 'require' de los
 *  archivos que contienen las clases, ya que son cargadas por esta clase
 *
 *  Ej. la clase Helper (utilizada mas abajo) se encuentra definida en
 *  /src/Code/Helper.php y su espacio de nombre es Code (namespace Code)
 *  en el objeto del class loader se registra el espacio de nombre Code
 *  asociandoló con el directorio /src, de esta manera el class loader
 *  lo buscará en /src/Code bajo el nombre Helper.php
 *
 *  @see    documentación oficial: http://symfony.com/doc/current/components/class_loader.html
 *
 */
require_once BASE_DIR.'vendor/Symfony/Component/ClassLoader/UniversalClassLoader.php';
use Symfony\Component\ClassLoader\UniversalClassLoader;
$loader = new UniversalClassLoader();
// registrar namespaces
$loader->registerNamespaces(array(
    'Symfony' => BASE_DIR.'vendor',
    'Code'    => BASE_DIR.'src'
));
// activar el loader
$loader->register();



/**

    instanciar un objeto helper

*/
/**
 *
 *  el objeto de la clase helper contiene métodos que pueden ser usados
 *  para facilitar y mejorar tanto la codificación como la lectura del código
 *
 */
use Code\Helper;
$helper = Helper::getInstance();



/**

    instanciar un objecto model

*/
/**
 *
 *  el objecto de la clase model representa una abstraccion de la base de datos
 *
 */
use Code\Model;
$model = Model::getInstance('localhost', 'proyecto_ingenieria', 'root', '');



/**

    instanciar un objeto request

*/
/**
 *
 *  el objeto de la clase request crea una abstracción orientada a objetos
 *  del requerimiento de la pagina (representado por variables $_GET, $_POST,
 *  $_FILE, $_COOKIES, etc.)
 *
 *  $request->query->get('algun_nombre') es equivalente a $_GET['algun_nombre']
 *  $request->request->get->('algun_nombre') es equivalente a $_POST['algun_nombre']
 *  $request->getPathInfo() es equivalente a $_SERVER['REQUEST_URI'] pero sin los parametros
 *  
 *  @see    documentacion oficial: http://symfony.com/doc/current/components/http_foundation/introduction.html
 *
 */
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();



/**

    definir una ultima constante super super importante

*/
define('BASE_URL', ( (preg_match('/^http:\/\//i', $request->getHttpHost()))
                  || (preg_match('/^https:\/\//i', $request->getHttpHost())) )
                    ? ($request->getHttpHost())
                    : ('http://'.$request->getHttpHost())
);



/**

    instanciar un objeto response y prepararlo

*/
/**
 *
 *  el objeto response genera una respuesta
 *  permite setear headers y contenido http
 *  y enviar la respuesta al cliente
 *
 *  @see    documentacion oficial: http://symfony.com/doc/current/components/http_foundation/introduction.html
 *
 */
use Symfony\Component\HttpFoundation\Response;
$response = new Response();
$response->setProtocolVersion('1.1');
$response->setStatusCode(200);
$response->setCharset('UTF-8');
$response->headers->set('Content-Type', 'text/html');
$response->prepare($request);

/**

    traer el controlador

*/
/**
 *
 *  main_controller es el controlador que decide a que controlador
 *  especifico le cede el control de la aplicación
 *
 *  layout utiliza tres variables para mostrar la aplicación:
 *      @param $title   define el titulo de la página html
 *      @param $slug    define el slug de la página html (para saber que pagina esta activa)
 *      @param $content define el contenido de la página html
 *
 *  ob_start permite almacenar en un buffer todo lo que se imprime,
 *  en vez de imprimirlo directamente
 *  ob_get_clean vacía el contenido del buffer en una variable
 *
 */
include BASE_DIR.'bundles/main_controller.php';
$page = $helper->include_layout(array(
        'title'=>$title,
        'content'=>$content,
        'slug'=>$slug,
        'message'=>$message,
        'message_type'=>$message_type
));



/**

    setear el contenido y enviarlo

*/
$response->setContent($page);
$response->send();

?>
